package com.shrcl.engineerprocess.domain;

import com.shrcl.engineerprocess.domain.CorpWeChatUser;
import com.shrcl.engineerprocess.domain.EngineerCapability;
import com.shrcl.engineerprocess.domain.EngineerCertification;
import com.shrcl.engineerprocess.domain.EngineerLevel;
import com.shrcl.engineerprocess.domain.EngineerMonthlyCost;
import com.shrcl.engineerprocess.domain.EngineerNotifyReceiver;
import com.shrcl.engineerprocess.domain.EngineerStatus;
import com.shrcl.engineerprocess.domain.impl.EngineerImpl;
import com.shrcl.engineerprocess.domain.proxy.EngineerProxy;
import com.shrct.businessprocess.organization.RCEmployee;
import edu.fudan.langlab.domain.security.User;
import edu.fudan.mylang.pf.EntityImplementation;
import edu.fudan.mylang.pf.IHasSimplePy;
import edu.fudan.mylang.pf.IModelObject;
import edu.fudan.mylang.pf.INamedModelObject;
import java.util.Collection;
import java.util.Date;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;

@EntityImplementation(implementBy = EngineerImpl.class)
public interface Engineer extends IModelObject, INamedModelObject, IHasSimplePy {
  public abstract RCEmployee getEmployee();
  
  public abstract Engineer setEmployee(final RCEmployee employee);
  
  public abstract String getCode();
  
  public abstract Engineer setCode(final String code);
  
  public abstract String getName();
  
  public abstract Engineer setName(final String name);
  
  public abstract String getSimplePy();
  
  public abstract Engineer setSimplePy(final String simplePy);
  
  public abstract String getEmail();
  
  public abstract Engineer setEmail(final String email);
  
  public abstract Double getSalary();
  
  public abstract Engineer setSalary(final Double salary);
  
  public abstract Collection<EngineerLevel> getLevels();
  
  public abstract Engineer addtoLevels(final EngineerLevel engineerLevel);
  
  public abstract Engineer setLevels(final Iterable<EngineerLevel> levels);
  
  public abstract Engineer removeFromLevels(final EngineerLevel engineerLevel);
  
  public abstract Engineer removeAllLevels();
  
  public abstract Collection<EngineerCertification> getCertifications();
  
  public abstract EngineerCertification createAndAddtoCertifications();
  
  public abstract EngineerCertification createAndAddtoCertifications(final Procedure1<EngineerCertification> updater);
  
  public abstract Engineer removeFromCertifications(final EngineerCertification engineerCertification);
  
  public abstract Engineer removeAllCertifications();
  
  public abstract Collection<EngineerCapability> getCapabilities();
  
  public abstract EngineerCapability createAndAddtoCapabilities();
  
  public abstract EngineerCapability createAndAddtoCapabilities(final Procedure1<EngineerCapability> updater);
  
  public abstract Engineer removeFromCapabilities(final EngineerCapability engineerCapability);
  
  public abstract Engineer removeAllCapabilities();
  
  public abstract Collection<EngineerMonthlyCost> getEngineerMonthlyCost();
  
  public abstract EngineerMonthlyCost createAndAddtoEngineerMonthlyCost();
  
  public abstract EngineerMonthlyCost createAndAddtoEngineerMonthlyCost(final Procedure1<EngineerMonthlyCost> updater);
  
  public abstract Engineer removeFromEngineerMonthlyCost(final EngineerMonthlyCost engineerMonthlyCost);
  
  public abstract Engineer removeAllEngineerMonthlyCost();
  
  public abstract Boolean getIsRemoved();
  
  public abstract Engineer setIsRemoved(final Boolean isRemoved);
  
  public abstract Integer getCurrentLevel();
  
  public abstract String getNameField();
  
  public abstract Integer getExpectedLevel();
  
  public abstract String getEntityName();
  
  public abstract Boolean monthCostExisting(final Date m);
  
  public abstract CorpWeChatUser asActiveCorpWechatUser();
  
  public abstract EngineerNotifyReceiver asNotifyReceiver();
  
  public abstract CorpWeChatUser getWechatUser();
  
  public abstract User asUser();
  
  public abstract CorpWeChatUser registerCorpWeChatUser(final String wechatuserid);
  
  public abstract void unregisterCorpWeChatUser(final String wechatuserid);
  
  public abstract Boolean isEngineerLevel(final EngineerLevel engineerLevel);
  
  public abstract Double getCostByMonth(final Date mon);
  
  public abstract EngineerMonthlyCost getCurrentMonthlyCost();
  
  public abstract Collection<EngineerLevel> getNewestMonthlyCostLevels();
  
  public abstract EngineerStatus getStatus();
  
  public abstract void start();
  
  public abstract void leave();
  
  public abstract EngineerCapability addCapability(final Procedure1<? super EngineerCapability> init);
  
  public abstract void removeCapability(final EngineerCapability engineerCapability);
  
  public abstract EngineerCertification addCertification(final Procedure1<? super EngineerCertification> init);
  
  public abstract void removeCertification(final EngineerCertification engineerCertification);
  
  public abstract EngineerMonthlyCost addMonthlyCost(final Procedure1<? super EngineerMonthlyCost> init);
  
  public abstract void removeMonthlyCost(final EngineerMonthlyCost monthlyCost);
  
  public abstract void monthlyCostTimer();
  
  public abstract void updateEngineerLevels(final Collection<EngineerLevel> levels);
  
  public abstract void reactive();
  
  public abstract Boolean isCreated();
  
  public abstract Boolean isQuited();
  
  public abstract EngineerProxy toProxy();
}
